/*
        声明一个ame 的方法到页面的 window 对象 返回Promise
        监听事件，当事件发生时调用这个方法 返回
 */
'use strict';

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch({
        headless: false   //代码运行时打开浏览器方便观察
    });
    const page = await browser.newPage();

    // Define a window.onCustomEvent function on the page. 定义一个窗口。页面上的onCustomEvent函数
    //此方法添加一个命名为 name 的方法到页面的 window 对象 当调用 name 方法时，在 node.js 中执行 puppeteerFunction，并且返回 Promise 对象，解析后返回 puppeteerFunction 的返回值
    await page.exposeFunction('onCustomEvent', e => {
        console.log('exposeFunction' + e);
        // console.log(`${e.type} fired`, e.detail || '');
        return "exposeFunction";
    });

    /**
     * Attach an event listener to page to capture a custom event on page load/navigation.
     * 将事件侦听器附加到页面，以捕获页面加载/导航上的自定义事件
     * @param {string} type Event name.
     * @return {!Promise}
     */
    function listenFor(type) {
        /**
         * 添加一个方法，在以下某个场景被调用：

         页面导航完成后
         页面的iframe加载或导航完成。这种场景，指定的函数被调用的上下文是新加载的iframe。
         */
        return page.evaluateOnNewDocument(type => {
            console.log('evaluateOnNewDocument');
            return document.addEventListener(type, e => {
                // window.onCustomEvent({type, detail: e.detail});
                console.log('evaluateOnNewDocument===onCustomEvent');
                window.onCustomEvent(type);
                console.log(window["onCustomEvent"])
            });

        }, type);
    }

// Listen for "app-ready" custom event on page load. 在页面加载时侦听“app-ready”自定义事件。
    let test = await listenFor('app-ready');
    await page.goto('http://www.baidu.com', {waitUntil: 'networkidle0'}); //原先是https://www.chromestatus.com/features  需要代理才能够访问
//现在这个页面没有这个方法 需要自己手动触发
    await page.evaluate(function () {
        console.log("dispatchEvent")
        if (document.fireEvent) {
            document.fireEvent('app-ready');
        }
        else {
            var ev = document.createEvent("HTMLEvents");
            ev.initEvent("app-ready", false, true);
            document.dispatchEvent(ev);
        }
    })
    await  test
    console.log(test)

    //getEventListeners(document)
    // await browser.close();
})();